@echo off
REM OneCode RAD 启动脚本 - Windows/WSL 兼容版本
REM 支持 Windows 原生环境和从 Windows 调用 WSL

setlocal EnableDelayedExpansion

REM 设置脚本目录
set "SCRIPT_DIR=%~dp0"
cd /d "%SCRIPT_DIR%"

REM 主要入口点
if "%~1"=="help" goto :show_help
if "%~1"=="-h" goto :show_help
if "%~1"=="--help" goto :show_help

echo [INFO] OneCode RAD 启动脚本 - Windows/WSL 兼容版本

REM 解析命令行参数
set "COMMAND=%~1"
if "%COMMAND%"=="" set "COMMAND=start"

REM 处理强制模式
if "%COMMAND%"=="wsl" (
    set "COMMAND=start"
    set "FORCE_WSL=1"
) else if "%COMMAND%"=="windows" (
    set "COMMAND=start"
    set "FORCE_WINDOWS=1"
)

REM 检测WSL环境
call :detect_wsl

REM 决定使用的环境
if defined FORCE_WSL (
    set "USE_WSL=1"
    echo [INFO] 强制使用WSL模式
) else if defined FORCE_WINDOWS (
    set "USE_WSL=0"
    echo [INFO] 强制使用Windows原生模式
) else (
    if "%WSL_AVAILABLE%"=="1" (
        set "USE_WSL=1"
        echo [INFO] 自动选择WSL模式
    ) else (
        set "USE_WSL=0"
        echo [INFO] 自动选择Windows原生模式
    )
)

REM 执行命令
if "%COMMAND%"=="start" (
    call :check_java
    if !errorlevel! neq 0 exit /b 1
    call :check_maven_wrapper
    if !errorlevel! neq 0 exit /b 1
    
    if "%USE_WSL%"=="1" (
        call :start_application_wsl
    ) else (
        call :start_application_windows
    )
) else if "%COMMAND%"=="stop" (
    if "%USE_WSL%"=="1" (
        call :stop_application_wsl
    ) else (
        call :stop_application
    )
) else if "%COMMAND%"=="restart" (
    if "%USE_WSL%"=="1" (
        call :stop_application_wsl
        timeout /t 2 /nobreak >nul
        call :check_java
        if !errorlevel! neq 0 exit /b 1
        call :check_maven_wrapper
        if !errorlevel! neq 0 exit /b 1
        call :start_application_wsl
    ) else (
        call :stop_application
        timeout /t 2 /nobreak >nul
        call :check_java
        if !errorlevel! neq 0 exit /b 1
        call :check_maven_wrapper
        if !errorlevel! neq 0 exit /b 1
        call :start_application_windows
    )
) else if "%COMMAND%"=="build" (
    call :check_java
    if !errorlevel! neq 0 exit /b 1
    call :check_maven_wrapper
    if !errorlevel! neq 0 exit /b 1
    call :build_project
) else if "%COMMAND%"=="status" (
    call :show_status
) else (
    echo [ERROR] 未知命令: %COMMAND%
    goto :show_help
)

exit /b 0

REM 检测WSL环境
:detect_wsl
wsl --list --quiet >nul 2>&1
if %errorlevel% equ 0 (
    set "WSL_AVAILABLE=1"
    echo [INFO] 检测到WSL环境可用
) else (
    set "WSL_AVAILABLE=0"
    echo [INFO] WSL环境不可用，使用Windows原生模式
)
goto :eof

REM 检测Java环境
:check_java
java -version >nul 2>&1
if %errorlevel% equ 0 (
    echo [INFO] 检测到Java环境
    for /f "tokens=3" %%g in ('java -version 2^>^&1 ^| findstr /i "version"') do (
        set JAVA_VERSION=%%g
        set JAVA_VERSION=!JAVA_VERSION:"=!
        echo [INFO] Java版本: !JAVA_VERSION!
    )
    exit /b 0
) else (
    echo [ERROR] 未找到Java环境
    echo [INFO] 请安装Java 8或更高版本
    echo [INFO] 下载地址: https://adoptopenjdk.net/
    exit /b 1
)

REM 检查Maven包装器
:check_maven_wrapper
if exist "mvnw.cmd" (
    echo [INFO] 使用Maven Wrapper
    exit /b 0
) else (
    mvn -version >nul 2>&1
    if !errorlevel! equ 0 (
        echo [INFO] 使用系统Maven
        exit /b 0
    ) else (
        echo [ERROR] 未找到Maven或Maven Wrapper
        exit /b 1
    )
)

REM 构建项目
:build_project
echo [INFO] 开始构建项目...

if exist "mvnw.cmd" (
    call mvnw.cmd clean package -DskipTests
) else (
    call mvn clean package -DskipTests
)

if %errorlevel% equ 0 (
    echo [SUCCESS] 项目构建成功
    exit /b 0
) else (
    echo [ERROR] 项目构建失败
    exit /b 1
)

REM 启动应用（Windows原生）
:start_application_windows
echo [INFO] 在Windows环境下启动OneCode RAD应用...

REM 检查JAR文件
set "JAR_FILE=target\ROOT.jar"
if not exist "%JAR_FILE%" (
    echo [ERROR] 未找到JAR文件: %JAR_FILE%
    echo [INFO] 尝试构建项目...
    call :build_project
    if !errorlevel! neq 0 exit /b 1
)

REM 设置端口
if not defined PORT set "PORT=8083"
echo [INFO] 应用将在端口 %PORT% 上启动

REM 获取本机IP地址
for /f "tokens=2 delims=:" %%a in ('ipconfig ^| findstr /c:"IPv4" 2^>nul') do (
    set "IP_ADDRESS=%%a"
    set "IP_ADDRESS=!IP_ADDRESS: =!"
    goto :ip_found
)
:ip_found

REM 启动应用
echo [INFO] 启动命令: java -jar %JAR_FILE% --server.port=%PORT%
start /b java -jar "%JAR_FILE%" --server.port=%PORT%

REM 等待应用启动
echo [INFO] 等待应用启动...
timeout /t 5 /nobreak >nul

echo [SUCCESS] OneCode RAD 启动成功!
echo [SUCCESS] 访问地址:
echo [SUCCESS]   本地: http://localhost:%PORT%
if defined IP_ADDRESS (
    echo [SUCCESS]   网络: http://!IP_ADDRESS!:%PORT%
)

echo [INFO] 按任意键退出...
pause >nul
exit /b 0

REM 启动应用（WSL环境）
:start_application_wsl
echo [INFO] 使用WSL环境启动OneCode RAD应用...

REM 检查WSL中的start.sh脚本
wsl test -f "./start.sh"
if %errorlevel% neq 0 (
    echo [ERROR] WSL中未找到start.sh脚本
    echo [INFO] 请确保start.sh文件存在并具有执行权限
    exit /b 1
)

REM 给start.sh添加执行权限
wsl chmod +x ./start.sh

REM 通过WSL启动应用
echo [INFO] 通过WSL启动应用...
if not defined PORT set "PORT=8083"

wsl bash -c "PORT=%PORT% ./start.sh start"
exit /b %errorlevel%

REM 停止应用
:stop_application
if exist ".app.pid" (
    set /p APP_PID=<.app.pid
    echo [INFO] 停止应用 (PID: !APP_PID!)...
    taskkill /f /pid !APP_PID! >nul 2>&1
    del ".app.pid" >nul 2>&1
    echo [SUCCESS] 应用已停止
) else (
    echo [WARNING] 未找到应用PID文件
    REM 尝试通过端口杀死进程
    if not defined PORT set "PORT=8083"
    for /f "tokens=5" %%a in ('netstat -ano ^| findstr ":%PORT%" 2^>nul') do (
        echo [INFO] 发现进程 %%a 占用端口 %PORT%，正在停止...
        taskkill /f /pid %%a >nul 2>&1
    )
)
goto :eof

REM 通过WSL停止应用
:stop_application_wsl
echo [INFO] 通过WSL停止应用...
wsl bash -c "./start.sh stop"
goto :eof

REM 查看应用状态
:show_status
if exist ".app.pid" (
    set /p APP_PID=<.app.pid
    tasklist /fi "pid eq !APP_PID!" 2>nul | findstr !APP_PID! >nul
    if !errorlevel! equ 0 (
        echo [SUCCESS] 应用正在运行 (PID: !APP_PID!)
    ) else (
        echo [WARNING] PID文件存在但应用未运行
        del ".app.pid" >nul 2>&1
    )
) else (
    echo [INFO] 应用未运行
)
goto :eof

REM 显示帮助信息
:show_help
echo OneCode RAD 启动脚本 - Windows/WSL版本
echo.
echo 用法: %~nx0 [命令] [选项]
echo.
echo 命令:
echo   start       启动应用 (默认)
echo   stop        停止应用
echo   restart     重启应用
echo   build       构建项目
echo   status      查看应用状态
echo   wsl         强制使用WSL模式
echo   windows     强制使用Windows原生模式
echo   help        显示帮助信息
echo.
echo 环境变量:
echo   PORT        指定端口号 (默认: 8083)
echo.
echo 示例:
echo   %~nx0 start
echo   %~nx0 wsl
echo   %~nx0 stop
echo   set PORT=9090 ^&^& %~nx0 start
goto :eof